home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swaga_c.zip / ARCHIVES.SWG / 0025_Zip Header.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-03  |  3KB  |  114 lines

  1. {
  2. > Does anyone know where I can obtain source for reading a ZIP
  3. > file.  I know I could just shell and execute PKUNZIP, but the
  4. > looks horrible. 8-) I would like to do it as transparently as
  5. > possible (and without shelling :)  TIA!
  6. }
  7. Type      ZFHeader=Record
  8.                      Signature                         :longint;
  9.                      Version,GPBFlag,Compress,Date,Time:word;
  10.                      CRC32,CSize,USize                 :longint;
  11.                      FNameLen,ExtraField               :word;
  12.                    end;
  13.  
  14.  
  15. type      PZipArchive=^TZipArchive;
  16.           TZipArchive=object(TGeneralArchive)
  17.                         constructor Init;
  18.                         procedure FindFirst(var sr:SearchRec);virtual;
  19.                         procedure FindNext(var sr:SearchRec);virtual;
  20.                       private
  21.                         Hdr:ZFHeader;
  22.                         function  GetHeader(var sr:SearchRec):string;
  23.                       end;
  24.  
  25. implementation
  26.  
  27. uses      Objects,OOAVUtil;
  28.  
  29. Const     SIG = $04034B50;                  { Signature }
  30.  
  31.  
  32. constructor TZipArchive.Init;
  33. begin
  34.   FillChar(Hdr,sizeof(Hdr),0);
  35. end;
  36.  
  37.  
  38. function  TZipArchive.GetHeader(var sr:SearchRec):string;
  39. var       b:byte;
  40.           FName:string;
  41. begin
  42.   fillchar(sr,sizeof(sr),0);
  43.   if _FArchive^.GetPos=_FArchive^.GetSize then
  44.     exit;
  45.   _Farchive^.Read(Hdr,SizeOf(Hdr));
  46.   if _FArchive^.Status<>stOk then
  47.     exit;
  48. { Why checking for Hdr.FNamelen=0?
  49.   Because the comments inserted in a ZIP-file are at the last field }
  50.   if Hdr.FNameLen=0 then
  51.     exit;
  52.   FName:='';
  53.   Repeat
  54.     _FArchive^.Read(b,1);
  55.     If b<>0 Then
  56.       FName:=FName+Chr(b);
  57.   Until (length(FName)=Hdr.FNameLen) or (b=0);
  58.   if b=0 then
  59.   begin
  60.     GetHeader:='';
  61.     exit;
  62.   end;
  63.   _FArchive^.Seek(_FArchive^.GetPos+Hdr.CSize+Hdr.ExtraField);
  64.   sr.Size:=Hdr.USize;
  65.   sr.Time:=Hdr.Date+Hdr.Time*longint(256*256);
  66.   GetHeader:=FName;
  67. end;
  68.  
  69.  
  70. procedure TZipArchive.FindFirst(var sr:SearchRec);
  71. var       FName:string;
  72.           found:boolean;
  73. begin
  74.   found:=false;
  75.   repeat
  76.     FName:=GetHeader(sr);
  77.     if FName='' then
  78.     begin
  79.       found:=true;
  80.       sr.Name:='';
  81.     end;
  82.     while pos('/',FName)<>0 do
  83.       FName[pos('/',FName)]:='\';
  84.     if Fits(FName,_SearchDir+_SearchFile) then
  85.     begin
  86.       sr.Name:=copy(FName,length(_SearchDir)+1,12);
  87.       found:=true;
  88.     end;
  89.   until found;
  90. end;
  91.  
  92.  
  93. procedure TZipArchive.FindNext(var sr:SearchRec);
  94. var       FName:string;
  95.           found:boolean;
  96. begin
  97.   found:=false;
  98.   repeat
  99.     FName:=GetHeader(sr);
  100.     if FName='' then
  101.     begin
  102.       found:=true;
  103.       sr.Name:='';
  104.     end;
  105.     while pos('/',FName)<>0 do
  106.       FName[pos('/',FName)]:='\';
  107.     if Fits(FName,_SearchDir+_SearchFile) then
  108.     begin
  109.       sr.Name:=copy(FName,length(_SearchDir)+1,12);
  110.       found:=true;
  111.     end;
  112.   until found;
  113. end;
  114.